Skip to content

在 .vue 里写 script setup lang=tsx 常见报错的完整解决方案 ​

本节目标:理解“在 .vue 里写 script setup lang=tsx 常见报错的完整解决方案”的核心思路,并能把它用于实际开发或面试表达。 错误表现 ESLint 报:Parsing error: '>' expected(或类似 “意外的 <”) 原因是 代码编译器(Vite + Vue 插件)早已支持 TSX,而 ESLint 解析器 仍按普通 TS 解析,看到 <div> 就当成泛型尖括号——于是语法报错。

1️⃣ 思路梳理

角色任务关键配置
TypeScript类型检查 & 保留 TSXcompilerOptions.jsx = "preserve"
jsxImportSource = "vue"
Vite / Babel把 TSX 转成浏览器可执行代码@vitejs/plugin-vue-jsx
@vue/babel-plugin-jsx
ESLint语法分析 & 规则校验vue-eslint-parser(拆 SFC)
@typescript-eslint/parser(解析 TSX)

缺哪一环就会报错;大部分脚手架已经配好前两环,本次故障属于 第三环缺配置。

2️⃣ 步骤速查

  1. 安装依赖(若还没装)pnpm add -D vue-eslint-parser @typescript-eslint/parser \ @vitejs/plugin-vue-jsx @vue/babel-plugin-jsx
  2. tsconfig.json 确保开启 TSX:{ "compilerOptions": { "jsx": "preserve", "jsxImportSource": "vue" // Vue 3.4+ 必须 }}
  3. vite.config.ts 启用 TSX 插件:import { defineConfig } from 'vite'import vue from '@vitejs/plugin-vue'import vueJsx from '@vitejs/plugin-vue-jsx'export default defineConfig({ plugins: [vue(), vueJsx()],})
  4. ESLint Flat-Config 补一段解析器配置(放在已有规则后即可——只改“关键差异行”,保持代码最小改动)// 💡 让 .vue 中的 <script lang="tsx"> 被正确解析
  {
    name: 'app/vue-sfc-tsx',
    files: ['**/*.vue'],
    languageOptions: {
      //

外层解析

 SFC
      parser: 'vue-eslint-parser',
      parserOptions: {
        //

内层 \<script\> 交给 TS 解析器

        parser: '@typescript-eslint/parser',
        ecmaFeatures: { jsx: true },     //

开启

 TSX
        extraFileExtensions: ['.vue'],   //

识别

 .vue
      },
    },
  },
  1. 如果还有独立 .tsx 文件,再加块
  {
    name: 'app/tsx-files',
    files: ['**/*.tsx'],
    languageOptions: { parserOptions: { ecmaFeatures: { jsx: true } } },
  },
  1. 重新执行pnpm lint # 应不再报 '>' expectedpnpm dev # TSX 正常编译

3️⃣ 背后原理

  1. vue-eslint-parser
    • 把 .vue 拆解成“模板 AST”和“脚本 AST”;
    • 对 <script setup> 再调用你指定的 子解析器。
  2. @typescript-eslint/parser
    • 实际解析 TS/TSX 语法,ecmaFeatures.jsx: true 告诉它“嘴里可能有 <div>”。
  3. JSX 流程
    • TypeScript “保留”JSX → 交给 Babel / esbuild 转换;
    • 转换时由 @vue/babel-plugin-jsx / vueJsx 插件把 JSX 变成 h(...) 调用。

4️⃣ 常见陷阱 & 提示

症状排查
IDE 仍红线确认 IDE 使用的 tsconfig 与项目一致;有时需重启 ES 模块。
编译通过但 ESLint 报错九成是没加 vue-eslint-parser;或 files 匹配不到。
模板宏报错TSX 里写 defineExpose 等宏要加 /#PURE/,或直接用 <script setup> 模式。
jest/vitest 测试失败在测试环境也需要 vueJsx Babel 插件;可用 @vitejs/plugin-vue-jsx 的 babelPreset。

5️⃣ 小结

  • 问题本质:编译器会,但 ESLint 不识别 TSX。
  • 一行判断:报错点在 ESLint 还是编译?前者就补解析器。
  • 核心修复:vue-eslint-parser ➕ @typescript-eslint/parser(ecmaFeatures.jsx)。

照此流程,一次配置,后续任何 .vue + TSX 代码都能愉快通过。

本站总访问 — 次